<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2020-02-25
 * Time: 14:15
 */

namespace Zwwl2016\Cluster;


class ClusterScaffold
{
    private $cluster;
    public function __construct(Cluster $cluster)
    {
        $this->cluster=$cluster;
    }

    /**
     * @param  string 文件路径
     * @throws \Exception
     */
    public function syncClusterServices($floder="./library/services")
    {
        if (!is_dir($floder)) {
            mkdir($floder, 0777, true);
        }
        $services=$this->cluster->execute('list', "system-service", "{}", false);
        $arr=[];
        foreach($services['list'] as $service) {
            $arr2 = explode("_", $service['key']);
            if (count($arr2) <= 1) {
                throw new \Exception("服务名太短，轻修正:" . $service['key']);
            }
            $class_name = ucfirst(strtolower($arr2[0])) . "ServiceKeys";
            if (!isset($arr[$class_name])) {
                $arr[$class_name] = [];
            }
            $field_name = "";
            for ($i = 1; $i < count($arr2); $i++) {
                $field_name .= ucfirst(strtolower($arr2[$i]));
            }
            $subArr = [];
            $subArr['key'] = $field_name;
            $subArr['value'] = $service['key'];
            $subArr['name'] = $service['name'];
            $arr[$class_name][] = $subArr;
        }
        print_r($arr);

        foreach($arr as $key=>$val) {

            $class_name=$key;
            $str=<<<EOF
<?php
class {$class_name}
{
    
EOF;
            for($i=0;$i<count($val);$i++)
            {
                $jj=<<<EOF
//{$val[$i]['name']}
    const {$val[$i]['key']} = '{$val[$i]['value']}';
    
EOF;

                $str.=$jj;
            }
            $code=$str."
}";
            file_put_contents($floder."/".$class_name.".php",$code);
        }
    }

//    public function createHandlers($floder="./library/handlers")
//    {
//        if(!is_dir($floder))
//        {
//            mkdir($floder,0777,true);
//        }
//        $handlers=$this->execute('list', "system-handler", "{}", false);
//        foreach($handlers['list'] as $handler)
//        {
//            $class_name='';
//            $field_list=array();    //类的属性列表
//            $field_type_list=array();   //属性与类型映射
//            $input_class=array();    //类的属性对应的列名。
//            $parameters=array();        //参数的列表
//            $construct_set_expression=array();    //设置构造参数
//            $parameter_set_expression=array();      //设置发送前参数
//            $obj_set_expression=array();            //设置结果解析参数。
//
//            $name=$handler['key'];
//            $arr=explode(":",$name);
//
//            foreach($arr as $item)
//            {
//                $class_name.=ucfirst($item);
//            }
//            $remark=json_decode($handler['remark'],true);
//            $input=$remark[0];
//            $output=$remark[1];
//            foreach($input as $tableName=>$subObj)
//            {
//                $arr=explode("_",$tableName);
//                $input_class_sub='';
//                foreach($arr as $item)
//                {
//                    $input_class_sub.=ucfirst($item);
//                }
//                $input_class[$tableName]=$input_class_sub;
//                $field_list[]=$tableName;
//                if(is_array($subObj))
//                {
//                    if(array_key_exists(0,$subObj))
//                    {
//                        $field_type_list[$tableName]='array';
//                        $parameters[]='array $'.$tableName;
//                    }
//                    else
//                    {
//                        $field_type_list[$tableName]=$input_class_sub;
//                        $parameters[]=$input_class_sub.' $'.$tableName;
//                    }
//                }
//                else
//                {
//                    $field_type_list[$tableName]='';
//                    $parameters[]='$'.$tableName;
//                }
//                $construct_set_expression[]='$this->'.$tableName.'=$'.$tableName.';';
//                $parameter_set_expression[]='$val["'.$tableName.'"]=$this->'.$tableName.';';
//                $obj_set_expression[]='$obj->'.$tableName.'=$this->renderClass($result[\''.$tableName.'\'],"'.$field_type_list[$tableName].'");';
//            }
//            foreach($output as $tableName=>$subObj)
//            {
//                $arr=explode("_",$tableName);
//                $input_class_sub='';
//                foreach($arr as $item)
//                {
//                    $input_class_sub.=ucfirst($item);
//                }
//                $field_list[]=$tableName;
//                if(is_array($subObj))
//                {
//                    if(array_key_exists(0,$subObj))
//                    {
//                        $field_type_list[$tableName]='array';
//                    }
//                    else
//                    {
//                        $field_type_list[$tableName]=$input_class_sub;
//                    }
//                }
//                else
//                {
//                    $field_type_list[$tableName]='';
//                }
//
//                $obj_set_expression[]='$obj->'.$tableName.'=$this->renderClass($result[\''.$tableName.'\'],"'.$field_type_list[$tableName].'");';
//            }
//            $class1 = new \ClassTemplate\ClassFile($class_name,array(
//                'template' => 'Handler.php.twig',
//                'template_dirs' => array('vendor/zwwl2016/cluster/src/templates'),
//            ));
//
//            $class1->addMethod('public','__construct',$parameters,$construct_set_expression);
//            foreach($field_list as $field)
//            {
//                $class1->addProperty($field,'');
//            }
//
//            $class1->addMethod('public','read',["Cluster \$cluster"],'$key="'.$name.'";
//$val=[];
//'.implode("\n",$parameter_set_expression).'
//$result=$cluster->readHandler($key,$val);
//$obj=new '.$class_name.'();
//'.implode("\n",$obj_set_expression).'
//return $obj;
//');
//
//
//            $class1->extendClass('BaseHandler');
//
//            $class1->addMethod('public','execute',["Cluster \$cluster"],'$key="'.$name.'";
//$val=[];
//'.implode("\n",$parameter_set_expression).'
//$result=$cluster->executeHandler($key,$val);');
//            $class1->useClass('\Zwwl2016\Cluster\Cluster');
//            $code = $class1->render();
//
//            file_put_contents($floder."/".$class_name.".php",$code);
//        }
//    }
}